#include<iostream>
#include<pthread.h>
#include<unistd.h>

using namespace std;

int cnt=0;

pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;//创建一把锁
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;//创建一个条件变量

void* Count(void* args)
{
    pthread_detach(pthread_self());//分离
    uint64_t number = (uint64_t)args;
    cout<<"pthread: "<<number<<"create success"<<endl;

    while(true)
    {
        pthread_mutex_lock(&mutex);//加锁

        //你怎么知道我们要让一个线程去休眠了呢？一定是临界资源不就绪，没错，临界资源也是有状态的
        //你怎么知道临界资源是否就绪？自己判断出来的！  判断是访问临界资源吗？是的，也就是判断必须在加锁之后
        pthread_cond_wait(&cond,&mutex);//条件变量，进入等待队列
        //为什么在这里wait
        //1.pthread_cond_wait让线程等待时，自动释放锁

        //等待唤醒

        cout<<"pthread: "<<number<<", cnt: "<<cnt++<<endl;


        pthread_mutex_unlock(&mutex);//解锁
    }
}

int main()
{
    for(uint64_t i=0;i<5;i++)
    {
        pthread_t tid;
        pthread_create(&tid,nullptr,Count,(void*)i);//值传递i,如果是传地址，新线程和主线程看到同一个i
        usleep(1000);
    }
    sleep(3);
    cout<<"main thread ctrl begin: "<<endl;

    while(true)
    {
        //唤醒指定条件变量下的一个线程
        //pthread_cond_signal(&cond);//唤醒在cond的等待队列的一个线程，默认都是第一个

        //唤醒指定条件变量下的所有进程
        pthread_cond_broadcast(&cond);//也是依次访问锁
        cout<<"signal one thread..."<<endl;
        sleep(1);
    }

    return 0;
}